package com.ssrs.dev.controller;


import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.toolkit.CollectionUtils;
import com.ssrs.core.manager.PageManager;
import com.ssrs.dev.model.Classroom;
import com.ssrs.dev.model.Device;
import com.ssrs.dev.model.DeviceVO1;
import com.ssrs.dev.service.IClassroomService;
import com.ssrs.dev.service.IDeviceService;
import com.ssrs.util.commom.APPUtil;
import com.ssrs.util.commom.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 教室设备管理：设备表 前端控制器
 * </p>
 *
 * @author 拾年之璐
 * @since 2021-05-19
 */
@Controller
@RequestMapping("/device")
public class DeviceController {

    @Autowired
    private IDeviceService deviceService;

    @Autowired
    private IClassroomService classroomService;

    /**
     * 接收路由 classroom/index GET 请求
     *
     * @return 跳转到 webapp/WEB-INF/ftl/cxh/device/index.ftl 页面
     */
    @RequestMapping(value = "index", method = RequestMethod.GET)
    public String index(Model model) {
        // 查询当前所有的教室信息
        List<Classroom> classroomList = classroomService.selectList(
                new EntityWrapper<Classroom>().like("is_delete", "0")
        );
        // 返回教室信息列表
        model.addAttribute("classroomList", classroomList);
        return "devPages/device/index";
    }

    /**
     * 【最原始的分页查询】接收前端 Layui 分页查询请求
     *
     * @param page   当前页
     * @param limit  每页条数（分页大小）
     * @param search 是否查询
     * @return 返回查询 JSON 集
     */
    @RequestMapping(value = "getDevicePage", method = RequestMethod.POST)
    @ResponseBody
    public Object getStudentPage(int page, int limit, String search) {
        boolean isSearch = StringUtils.isNotBlank(search);
        // 检索.
        // 简单分页查询.
        Page<Device> deviceViewPage = deviceService.selectPage(
                // 翻页对象
                new Page<>(page, limit),
                // 拼接上like语句【其后还可以继续拼接其他SQL语句，如orderby...】
                new EntityWrapper<Device>()
                        .like("is_delete", "0")
                        .like(isSearch, "device_name", search)
        );
        // 返回查询JSON结果集合
        return PageManager.buildPage(deviceViewPage);
    }

    /**
     * 【多字段查询】接收前端 Layui 分页查询请求
     *
     * @param page     当前页
     * @param limit    每页条数（分页大小）
     * @param deviceNo 是否查询
     * @return 返回查询 JSON 集
     */
    @RequestMapping(value = "getDevicePage2", method = RequestMethod.POST)
    @ResponseBody
    public Object getStudentPage2(int page, int limit, String deviceNo, String deviceName, String deviceSource) {
        boolean isSearch_deviceNo = false;
        boolean isSearch_deviceName = false;
        boolean isSearch_deviceSource = false;
        // 检索.
        if (StringUtils.isNotBlank(deviceNo)) {
            isSearch_deviceNo = true;
        }
        // 检索.
        if (StringUtils.isNotBlank(deviceName)) {
            isSearch_deviceName = true;
        }
        // 检索.
        if (StringUtils.isNotBlank(deviceSource)) {
            isSearch_deviceSource = true;
        }
        // 简单分页查询.
        Page<Device> devicePage = deviceService.selectPage(
                // 翻页对象
                new Page<>(page, limit),
                // 拼接上like语句【其后还可以继续拼接其他SQL语句，如orderby...】
                new EntityWrapper<Device>()
                        .like("is_delete", "0")
                        // 模糊查询
                        .like(isSearch_deviceNo, "device_no", deviceNo)
                        .like(isSearch_deviceName, "device_name", deviceName)
                        .like(isSearch_deviceSource, "device_source", deviceSource)
        );
        // 返回查询JSON结果集合
        return PageManager.buildPage(devicePage);
    }

    /**
     * 【多字段关联查询】接收前端 Layui 分页查询请求
     *
     * @param page     当前页
     * @param limit    每页条数（分页大小）
     * @param deviceNo 是否查询
     * @return 返回查询 JSON 集
     */
    @RequestMapping(value = "getDevicePage3", method = RequestMethod.POST)
    @ResponseBody
    public Object getStudentPage3(int page, int limit, String deviceNo, String deviceName, String deviceRoomBuilding, String deviceRoomNumber) {
        // 关联的列表
        boolean isUnion = false;
        boolean isEmpty = false;
        List<Integer> resultList = new ArrayList<>();
        // 先查询教室表
        if (StringUtils.isNotBlank(deviceRoomBuilding) || StringUtils.isNotBlank(deviceRoomNumber)) {
            // 先查询教室表中符合要求的数据
            List<Classroom> classrooms = classroomService.selectList(
                    new EntityWrapper<Classroom>()
                            .like("is_delete", "0")
                            .like(StringUtils.isNotBlank(deviceRoomBuilding), "room_building", deviceRoomBuilding)
                            .like(StringUtils.isNotBlank(deviceRoomNumber), "room_number", deviceRoomNumber)
            );
            if (CollectionUtils.isNotEmpty(classrooms)) {
                isUnion = true;
                classrooms.forEach(item -> {
                    resultList.add(item.getId());
                });
            } else {
                isEmpty = true;
            }
        }
        // 返回的数据信息
        Page<Device> devicePage = new Page<>();
        // 前两个条件不满足，后边就不用执行了
        if (isEmpty) {
            return PageManager.buildPage(devicePage);
        }
        // 构造条件查询
        EntityWrapper<Device> wrapper = new EntityWrapper<>();
        wrapper.like("is_delete", "0")
                .like(StringUtils.isNotBlank(deviceNo), "device_no", deviceNo)
                .like(StringUtils.isNotBlank(deviceName), "device_name", deviceName);
        // 开启关联查询
        if (isUnion) {
            wrapper.in("device_classroom", resultList);
        }
        // 简单分页查询.
        devicePage = deviceService.selectPage(
                new Page<>(page, limit),
                wrapper
        );
        // 返回查询JSON结果集合
        return PageManager.buildPage(devicePage);
    }


    @RequestMapping(value = "getDevice", method = RequestMethod.GET)
    @ResponseBody
    public Object getDevice(){
        return deviceService.selectList(
                new EntityWrapper<Device>().like("is_delete", "0")
        );
    }

    /**
     * 接收路由 /classroom/goAdd GET 请求
     *
     * @return 跳转到 /webapp/WEB-INF/ftl/cxh/classroom/add.ftl 页面
     */
    @RequestMapping(value = "goAdd", method = RequestMethod.GET)
    public String goAdd(Model model) {
        // 查询当前编辑的教室信息
        List<Classroom> classroomList = classroomService.selectList(
                new EntityWrapper<Classroom>().like("is_delete", "0")
        );
//        //底层原理：使用request.setAttribute()方法
        model.addAttribute("classroomList", classroomList);
        //返回视图
        return "devPages/device/add";
    }

    /**
     * 接收Ajax /device/add POST 请求【加上 @ResponseBody 就代表返回JSON数据，不加 就是返回视图页面】
     *
     * @param device ajax提交的信息
     * @return 返回添加成败的JSON提示
     */
    @RequestMapping(value = "add", method = RequestMethod.POST)
    @ResponseBody
    public Object add(Device device) {
        // 为实体添加时间和是否删除状态
        Date date = new Date();
        device.setIsDelete(0);
        device.setCreateTime(date);
        device.setUpdateTime(date);
        // 执行插入并返回结果
        //如果添加成功，就返回 {status:200,message:'添加成功'}的JSON格式类型数据给前台 否则就返回{status:101,message:'添加失败'}
//        if (deviceService.insert(device)) {
//            return APPUtil.resultMapType(APPUtil.INSERT_SUCCESS_TYPE);
//        } else {
//            return APPUtil.resultMapType(APPUtil.INSERT_ERROR_TYPE);
//        }
        return deviceService.insert(device) ? APPUtil.resultMapType(APPUtil.INSERT_SUCCESS_TYPE) : APPUtil.resultMapType(APPUtil.INSERT_ERROR_TYPE);
//        return b ? APPUtil.resultMapType(APPUtil.INSERT_SUCCESS_TYPE) : APPUtil.resultMapType(APPUtil.INSERT_ERROR_TYPE);
    }

    /**
     * 接收路由 /device/goUpdate GET 请求
     *
     * @param id    教室信息的ID（主键）
     * @param model 视图
     * @return 跳转到 /webapp/WEB-INF/ftl/cxh/device/update.ftl 页面
     */
    @RequestMapping(value = "goUpdate", method = RequestMethod.GET)
    public String goUpdate(int id, Model model) {
        // 查询当前编辑的设备信息
        Device device = deviceService.selectById(id);
        // 查询当前所有的教室信息
        List<Classroom> classroomList = classroomService.selectList(
                new EntityWrapper<Classroom>().like("is_delete", "0")
        );
        // 返回教室信息列表
        model.addAttribute("classroomList", classroomList);
        // 返回设备信息列表
        model.addAttribute("device", device);
        //返回视图
        return "devPages/device/update";
    }

    /**
     * 接收AJAX classroom/update POST 请求
     *
     * @param device 编辑后的教室信息
     * @return 编辑成败的JSON
     */
    @RequestMapping(value = "update", method = RequestMethod.POST)
    @ResponseBody
    public Object update(Device device) {
        Date date = new Date();
        device.setUpdateTime(date);
        // 根据 ID 选择修改，只修改不为空的字段
        boolean b = deviceService.updateById(device);
        // 返回结果
        return b ? APPUtil.resultMapType(APPUtil.UPDATE_SUCCESS_TYPE) : APPUtil.resultMapType(APPUtil.UPDATE_ERROR_TYPE);
    }

    /**
     * 接收路由 /device/goCopy GET 请求
     *
     * @param id    教室信息的ID（主键）
     * @param model 视图
     * @return 跳转到 /webapp/WEB-INF/ftl/cxh/device/copy.ftl 页面
     */
    @RequestMapping(value = "goCopy", method = RequestMethod.GET)
    public String goCopy(long id, Model model) {
        // 查询当前所有的教室信息
        List<Classroom> classroomList = classroomService.selectList(
                new EntityWrapper<Classroom>().like("is_delete", "0")
        );
        // 返回教室信息列表
        model.addAttribute("classroomList", classroomList);
        // 查询当前编辑的设备信息
        Device device = deviceService.selectById(id);
        // 返回设备信息列表
        model.addAttribute("device", device);
        //返回视图
        return "devPages/device/copy";
    }

    /**
     * 接收AJAX /device/del POST 请求
     *
     * @param id 要删除的设备ID
     * @return 删除成败的JSON
     */
    @RequestMapping(value = "del", method = RequestMethod.POST)
    @ResponseBody
    public Object del(int id) {
        Date date = new Date();
        Device device = new Device();
        device.setId(id);
        device.setIsDelete(1);
        device.setDeleteTime(date);
        // 进行逻辑删除
        boolean b = deviceService.updateById(device);
        // 返回结果
        return b ? APPUtil.resultMapType(APPUtil.DELEATE_SUCCESS_TYPE) : APPUtil.resultMapType(APPUtil.DELEATE_ERROR_TYPE);
    }


    /**
     * 接收路由 /classroom/goAdd GET 请求
     *
     * @return 跳转到 /webapp/WEB-INF/ftl/cxh/classroom/add.ftl 页面
     */
    @RequestMapping(value = "goSta1", method = RequestMethod.GET)
    public String goTongji() {
        return "devPages/device/statistics1";
    }

    /**
     * 饼状图
     * 获取所有相同设备的【设备(型号)名】【总数】【已分配数】
     *
     * @return LIST
     */
    @RequestMapping(value = "getDeviceData01", method = RequestMethod.GET)
    @ResponseBody
    public List<DeviceVO1> getData01() {
        return deviceService.getStats01();
    }


    /**
     * 柱状图，使用寿命图
     * 获取所有相同设备的【设备(型号)名】【总数】【已分配数】
     *
     * @return LIST
     */
    @RequestMapping(value = "getDeviceData02", method = RequestMethod.GET)
    @ResponseBody
    public String getData02() {
        return "0";
    }

}